package com.cloudfast.dao;

import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;

import com.cloudfast.common.page.Page;
import com.cloudfast.entity.BaseEntity;

/**
 * @author liuyw
 * @描述:基础类
 * @date 2020年4月30日
 */
public interface BaseDao<T extends BaseEntity, Key> {

    /**
     * -获取管理类
     *
     * @return
     * @author liuyw
     * @date 2020年4月30日
     */
    public EntityManager getEntityManager();

    /**
     * -Description:执行hibernate语句
     *
     * @param hql
     * @return
     * @auth liuyinwwei
     * @date 2018年9月18日
     */
    public int excute(String hql);

    /**
     * -Description:执行hibernate语句
     *
     * @param hql
     * @param params :name 对应的参数
     * @return
     */
    public int excute(String hql, Map<String, Object> params);

    /**
     * -执行SQL语句
     *
     * @param sql
     * @return
     * @auth liuyinwwei
     * @date 2018年9月18日
     */
    public int nativeExcute(String sql);

    /**
     * -执行SQL语句
     *
     * @param sql
     * @param params
     * @return
     */
    public int nativeExcute(String sql, Map<String, Object> params);

    /**
     * 根据hql 查询语句
     *
     * @param hql
     * @return
     * @author liuyw
     */
    public List<T> findList(String hql);

    /**
     * 根据hql 查询语句
     *
     * @param hql
     * @param params
     * @return
     */
    public List<T> findList(String hql, Map<String, Object> params);

    /**
     * 根据hql 查询语句
     *
     * @param sql
     * @return
     * @author liuyw
     */
    public List<Map<String, Object>> nativeQuery(String sql);

    /**
     * 根据hql 查询语句
     *
     * @param sql
     * @param params
     * @return
     */
    public List<Map<String, Object>> nativeQuery(String sql, Map<String, Object> params);

    /**
     * 自动查询sql
     *
     * @param page
     * @param entity
     * @return
     */
    public Page<T> findPage(Page<T> page, T entity);

    /**
     * HQL页面查询
     *
     * @param page 封装的分页参数
     * @param hql  hibernate 语句
     * @return
     * @auth liuyinwwei
     * @date 2018年9月18日
     */
    public Page<T> findPage(Page<T> page, String hql);

    /**
     * HQL页面查询
     *
     * @param page
     * @param hql
     * @param params
     * @return
     */
    public Page<T> findPage(Page<T> page, String hql, Map<String, Object> params);

    /**
     * 原生sql 返回提示
     *
     * @param page
     * @param sql
     * @return
     */
    public Page<T> nativeQueryPage(Page<T> page, String sql);

    /**
     * 原生sql 返回提示
     *
     * @param page
     * @param sql
     * @return
     */
    public Page<T> nativeQueryPage(Page<T> page, String sql, Map<String, Object> params);

    /**
     * SQL分页查询
     *
     * @param page
     * @param sql
     * @return
     * @author liuyw
     */
    public Page<Map<String, Object>> nativeMapPage(Page<Map<String, Object>> page, String sql);

    /**
     * 分页查询
     *
     * @param page
     * @param sql
     * @param params
     * @return
     */
    public Page<Map<String, Object>> nativeMapPage(Page<Map<String, Object>> page, String sql,
                                                   Map<String, Object> params);

    /**
     * -描述:添加与修改
     *
     * @param entity
     * @author liuyw
     * @date 2020年4月13日
     */
    public void saveOrUpdate(T entity);

    /**
     * 删除状态: 如果实体中包括有@DeleteField 的字段(get方法上), 执行update,否则 执行 delete
     *
     * @param id
     */
    public void deleteById(Key id);

    /**
     * 根据id 查询实体类
     *
     * @param id
     * @return
     */
    public T findOne(Key id);

    /**
     * 原生sql 转 entity 对象
     *
     * @param sql
     * @param params
     * @param clazz
     * @return
     */
    @SuppressWarnings("hiding")
    public <T> T gsonEntity(String sql, Map<String, Object> params, Class<T> clazz);

}
